package com.priox.sigar.application.acreedor;

import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.application.mappers.AcreedorMapper;
import com.priox.sigar.client.dto.AcreedorDTO;
import com.priox.sigar.client.dto.AcreedorSociedadDTO;
import com.priox.sigar.client.dto.ClienteSociedadDTO;
import com.priox.sigar.client.dto.SociedadDTO;
import com.priox.sigar.domain.model.*;
import com.priox.sigar.server.infrastructure.persistence.exception.ApplicationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Component
public class RegistroAcreedorAppImpl implements RegistroAcreedorApp {

    @Autowired
    DTOMapperService mapperService;

    @Autowired
    AcreedorRepository acreedorRepository;

    @Autowired
    SociedadRepository sociedadRepository;

    @Autowired
    AcreedorMapper acreedorMapper;


    public List<AcreedorDTO> findByAcreedorId(String acreedorId){
        return acreedorMapper.findByAcreedorId(acreedorId);
    }


    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(Acreedor acreedor,List<AcreedorSociedad> acreedorSociedadList, boolean updateMode) {

        acreedorMapper.deleteSociedad(acreedor.getAcreedorId());
        if (updateMode) {
            acreedorRepository.merge(acreedor);
        } else {
            Integer cont = acreedorMapper.existeCuentaId(acreedor.getAcreedorId());
            if (cont!=null && cont > 0) {
                throw new ApplicationException("El acreedor '" + acreedor.getAcreedorId() + "' ya esta registrada");
            }
            acreedorRepository.persist(acreedor);
        }

        acreedorRepository.persisSociedades(acreedorSociedadList);

    }

    public void deleteAll() {
        acreedorMapper.deleteAll();
    }

    public void deleteDocumentoAll() {
        acreedorMapper.deleteDocumentoAll();
    }

    public List<SociedadDTO> findByIdList(List<String> seleccionados) {
        List<Sociedad> sociedadList = sociedadRepository.findByIds(seleccionados);
        List<SociedadDTO> result = new ArrayList<SociedadDTO>();

        for (Sociedad sociedad : sociedadList) {
            result.add(mapperService.map(sociedad, SociedadDTO.class));
        }
        return result;
    }

    public AcreedorDTO findById(String acreedorId) {
        AcreedorDTO acreedor = acreedorMapper.findByAcreedorId(acreedorId).get(0);
        List<AcreedorSociedadDTO> clienteSociedad=acreedorRepository.obtenerAcreedorSociedadList(acreedorId);
        acreedor.setAcreedorSociedad(clienteSociedad);
        return acreedor;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void delete(Acreedor acreedor) {
       acreedorRepository.remove(acreedor);
    }
}
